/*
案例描述
- 公司今天招聘了10个员工（ABCDEFGHIJ），10名员工进入公司之后，需要指派员工在那个部门工作
- 员工信息有: 姓名  工资组成；部门分为：策划、美术、研发
- 随机给10名员工分配部门和工资
- 通过multimap进行信息的插入  key(部门编号) value(员工)
- 分部门显示员工信息

实现步骤
创建10名员工，放到vector中
遍历vector容器，取出每个员工，进行随机分组
分组后，将员工部门编号作为key，具体员工作为value，放入到multimap容器中
分部门显示员工信息
*/

#include <iostream>
#include <vector>
#include <map>
#include <ctime>
using namespace std;

class Worker
{
public:
    Worker(string name, int salary) : m_name(name), m_salary(salary) {};

public:
    string m_name; // 姓名
    int m_salary;  // 工资
};

// 创建员工
void create_woeker(vector<Worker> &v, int num)
{
    string prefix = "staff_";
    for (int i = 0; i < num; i++)
    {
        string name = prefix + to_string(i);
        int salary = rand() % 10001 + 10000; // 10000 ~ 20000  // rand()%(b-a+1) + a   生成 a~b直接的数
        Worker worker(name, salary);
        v.push_back(worker);
    }
}

// 员工分组
void set_gorup(const vector<Worker> &v, multimap<int, Worker> &m)
{
    // for (auto it = v.begin(); it != v.end(); it++)
    for (vector<Worker>::const_iterator it = v.begin(); it != v.end(); it++)
    {
        int dep_id = rand() % 3; // 0, 1, 2
        m.insert(pair<int, Worker>(dep_id, *it));
    }
}

// 展示分组结果
void show(const multimap<int, Worker> &m)
{
    // cout << "-- Mastermind --" << endl;
    const map<int, string> depament_mp = {
        {0, "Mastermind"}, // 策划
        {1, "Art"},        // 艺术
        {2, "Development"} // 研发
    };

    for (map<int, string>::const_iterator it = depament_mp.begin(); it != depament_mp.end(); it++)
    {
        int dep_id = it->first;
        string dep_name = it->second;
        auto pos = m.find(dep_id);
        int count = m.count(dep_id);
        int index = 0;

        cout << "------ " << dep_name << " ------" << endl;
        for (; pos != m.end() && index < count; pos++, index++)
        {
            cout << "name: " << pos->second.m_name << " salary: " << pos->second.m_salary << endl;
        }
    }
}

int main()
{
    vector<Worker> vct;
    multimap<int, Worker> mp;

    create_woeker(vct, 10);
    set_gorup(vct, mp);
    show(mp);

    return 0;
}